package org.goodsmanager.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 操作日志实体类
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperationLog implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 日志ID（UUID）
     */
    private String id;

    /**
     * 操作用户ID
     */
    private String userId;

    /**
     * 操作用户名（关联查询）
     */
    private String username;

    /**
     * 操作类型：CREATE/UPDATE/DELETE/QUERY/LOGIN/LOGOUT
     */
    private String operationType;

    /**
     * 操作模块：商品/分类/用户/系统等
     */
    private String module;

    /**
     * 操作描述
     */
    private String description;

    /**
     * 请求URL
     */
    private String requestUrl;

    /**
     * 请求方法：GET/POST/PUT/DELETE
     */
    private String requestMethod;

    /**
     * 请求参数
     */
    private String requestParams;

    /**
     * IP地址
     */
    private String ipAddress;

    /**
     * 用户代理
     */
    private String userAgent;

    /**
     * 操作状态：SUCCESS/ERROR
     */
    private String status;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 执行时间（毫秒）
     */
    private Long executionTime;

    /**
     * 操作时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 获取操作类型文本
     */
    public String getOperationTypeText() {
        if (operationType == null) {
            return "未知";
        }
        return switch (operationType) {
            case "CREATE" -> "新增";
            case "UPDATE" -> "更新";
            case "DELETE" -> "删除";
            case "QUERY" -> "查询";
            case "LOGIN" -> "登录";
            case "LOGOUT" -> "登出";
            case "EXPORT" -> "导出";
            case "IMPORT" -> "导入";
            default -> "未知";
        };
    }

    /**
     * 获取操作状态文本
     */
    public String getStatusText() {
        if (status == null) {
            return "未知";
        }
        return switch (status) {
            case "SUCCESS" -> "成功";
            case "ERROR" -> "失败";
            default -> "未知";
        };
    }
}